{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "season属性的不同取值和次数:\n",
      "3    188\n",
      "2    184\n",
      "1    181\n",
      "4    178\n",
      "Name: season, dtype: int64\n",
      "weathersit属性的不同取值和次数:\n",
      "1    463\n",
      "2    247\n",
      "3     21\n",
      "Name: weathersit, dtype: int64\n",
      "weekday属性的不同取值和次数:\n",
      "6    105\n",
      "1    105\n",
      "0    105\n",
      "5    104\n",
      "4    104\n",
      "3    104\n",
      "2    104\n",
      "Name: weekday, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "import numpy as np  # 矩阵操作\n",
    "import pandas as pd # SQL数据处理\n",
    "\n",
    "from sklearn.metrics import r2_score  #评价回归预测模型的性能\n",
    "\n",
    "import matplotlib.pyplot as plt   #画图\n",
    "import seaborn as sns\n",
    "\n",
    "# 图形出现在Notebook里而不是新窗口\n",
    "%matplotlib inline\n",
    "\n",
    "#导入数据\n",
    "dpath=\"C:\\Users\\ya\\w1yj8\\\\\"\n",
    "data = pd.read_csv(dpath+\"day.csv\")\n",
    "\n",
    "#分割训练数据和测试数据\n",
    "#train=data[data.yr==0]\n",
    "#test=data[data.yr==1]\n",
    "\n",
    "#特征工程\n",
    "cate_features = [\"season\",\"weathersit\",\"weekday\"]\n",
    "for col in cate_features:\n",
    "    print \"%s属性的不同取值和次数:\" % col\n",
    "    print data[col].value_counts()\n",
    "    data[col] = data[col].astype('object')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   season_1  season_2  season_3  season_4  weathersit_1  weathersit_2  \\\n",
      "0         1         0         0         0             0             1   \n",
      "1         1         0         0         0             0             1   \n",
      "2         1         0         0         0             1             0   \n",
      "3         1         0         0         0             1             0   \n",
      "4         1         0         0         0             1             0   \n",
      "\n",
      "   weathersit_3  weekday_0  weekday_1  weekday_2  weekday_3  weekday_4  \\\n",
      "0             0          0          0          0          0          0   \n",
      "1             0          1          0          0          0          0   \n",
      "2             0          0          1          0          0          0   \n",
      "3             0          0          0          1          0          0   \n",
      "4             0          0          0          0          1          0   \n",
      "\n",
      "   weekday_5  weekday_6  \n",
      "0          0          1  \n",
      "1          0          0  \n",
      "2          0          0  \n",
      "3          0          0  \n",
      "4          0          0  \n"
     ]
    }
   ],
   "source": [
    "#该4类特征的取值不多，用one-hot编码\n",
    "\n",
    "#特征处理\n",
    "x_train_cat = data[cate_features]\n",
    "x_train_cat = pd.get_dummies(x_train_cat)\n",
    "x_train_cat.head()\n",
    "df = pd.DataFrame(x_train_cat)\n",
    "df.to_csv(\"C:\\Users\\ya\\w1yj8\\meng.csv\")\n",
    "print x_train_cat.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "           x0        x1        x2      x0^2     x0 x1     x0 x2      x1^2  \\\n",
      "0    0.344167  0.805833  0.160446  0.118451  0.277341  0.055220  0.649367   \n",
      "1    0.363478  0.696087  0.248539  0.132116  0.253012  0.090338  0.484537   \n",
      "2    0.196364  0.437273  0.248309  0.038559  0.085865  0.048759  0.191208   \n",
      "3    0.200000  0.590435  0.160296  0.040000  0.118087  0.032059  0.348613   \n",
      "4    0.226957  0.436957  0.186900  0.051509  0.099170  0.042418  0.190931   \n",
      "5    0.204348  0.518261  0.089565  0.041758  0.105906  0.018302  0.268594   \n",
      "6    0.196522  0.498696  0.168726  0.038621  0.098005  0.033158  0.248698   \n",
      "7    0.165000  0.535833  0.266804  0.027225  0.088412  0.044023  0.287117   \n",
      "8    0.138333  0.434167  0.361950  0.019136  0.060060  0.050070  0.188501   \n",
      "9    0.150833  0.482917  0.223267  0.022751  0.072840  0.033676  0.233209   \n",
      "10   0.169091  0.686364  0.122132  0.028592  0.116058  0.020651  0.471096   \n",
      "11   0.172727  0.599545  0.304627  0.029835  0.103558  0.052617  0.359454   \n",
      "12   0.165000  0.470417  0.301000  0.027225  0.077619  0.049665  0.221292   \n",
      "13   0.160870  0.537826  0.126548  0.025879  0.086520  0.020358  0.289257   \n",
      "14   0.233333  0.498750  0.157963  0.054444  0.116375  0.036858  0.248752   \n",
      "15   0.231667  0.483750  0.188433  0.053670  0.112069  0.043654  0.234014   \n",
      "16   0.175833  0.537500  0.194017  0.030917  0.094510  0.034115  0.288906   \n",
      "17   0.216667  0.861667  0.146775  0.046945  0.186695  0.031801  0.742470   \n",
      "18   0.292174  0.741739  0.208317  0.085366  0.216717  0.060865  0.550177   \n",
      "19   0.261667  0.538333  0.195904  0.068470  0.140864  0.051262  0.289802   \n",
      "20   0.177500  0.457083  0.353242  0.031506  0.081132  0.062700  0.208925   \n",
      "21   0.059130  0.400000  0.171970  0.003496  0.023652  0.010169  0.160000   \n",
      "22   0.096522  0.436522  0.246600  0.009316  0.042134  0.023802  0.190551   \n",
      "23   0.097391  0.491739  0.158330  0.009485  0.047891  0.015420  0.241807   \n",
      "24   0.223478  0.616957  0.129796  0.049942  0.137876  0.029007  0.380636   \n",
      "25   0.217500  0.862500  0.293850  0.047306  0.187594  0.063912  0.743906   \n",
      "26   0.195000  0.687500  0.113837  0.038025  0.134063  0.022198  0.472656   \n",
      "27   0.203478  0.793043  0.123300  0.041403  0.161367  0.025089  0.628917   \n",
      "28   0.196522  0.651739  0.145365  0.038621  0.128081  0.028567  0.424764   \n",
      "29   0.216522  0.722174  0.073983  0.046882  0.156367  0.016019  0.521535   \n",
      "..        ...       ...       ...       ...       ...       ...       ...   \n",
      "701  0.347500  0.823333  0.124379  0.120756  0.286108  0.043222  0.677877   \n",
      "702  0.452500  0.767500  0.082721  0.204756  0.347294  0.037431  0.589056   \n",
      "703  0.475833  0.733750  0.174129  0.226417  0.349142  0.082856  0.538389   \n",
      "704  0.438333  0.485000  0.324021  0.192136  0.212592  0.142029  0.235225   \n",
      "705  0.255833  0.508750  0.174754  0.065451  0.130155  0.044708  0.258827   \n",
      "706  0.320833  0.764167  0.130600  0.102934  0.245170  0.041901  0.583951   \n",
      "707  0.381667  0.911250  0.101379  0.145670  0.347794  0.038693  0.830377   \n",
      "708  0.384167  0.905417  0.157975  0.147584  0.347831  0.060689  0.819780   \n",
      "709  0.435833  0.925000  0.190308  0.189950  0.403146  0.082943  0.855625   \n",
      "710  0.353333  0.596667  0.296037  0.124844  0.210822  0.104600  0.356012   \n",
      "711  0.297500  0.538333  0.162937  0.088506  0.160154  0.048474  0.289802   \n",
      "712  0.295833  0.485833  0.174129  0.087517  0.143725  0.051513  0.236034   \n",
      "713  0.281667  0.642917  0.131229  0.079336  0.181089  0.036963  0.413342   \n",
      "714  0.324167  0.650417  0.106350  0.105084  0.210844  0.034475  0.423042   \n",
      "715  0.362500  0.838750  0.100742  0.131406  0.304047  0.036519  0.703502   \n",
      "716  0.393333  0.907083  0.098258  0.154711  0.356786  0.038648  0.822800   \n",
      "717  0.410833  0.666250  0.221404  0.168784  0.273717  0.090960  0.443889   \n",
      "718  0.332500  0.625417  0.184092  0.110556  0.207951  0.061211  0.391146   \n",
      "719  0.330000  0.667917  0.132463  0.108900  0.220413  0.043713  0.446113   \n",
      "720  0.326667  0.556667  0.374383  0.106711  0.181845  0.122299  0.309878   \n",
      "721  0.265833  0.441250  0.407346  0.070667  0.117299  0.108286  0.194702   \n",
      "722  0.245833  0.515417  0.133083  0.060434  0.126707  0.032716  0.265655   \n",
      "723  0.231304  0.791304  0.077230  0.053502  0.183032  0.017864  0.626162   \n",
      "724  0.291304  0.734783  0.168726  0.084858  0.214045  0.049151  0.539906   \n",
      "725  0.243333  0.823333  0.316546  0.059211  0.200344  0.077026  0.677877   \n",
      "726  0.254167  0.652917  0.350133  0.064601  0.165950  0.088992  0.426301   \n",
      "727  0.253333  0.590000  0.155471  0.064178  0.149466  0.039386  0.348100   \n",
      "728  0.253333  0.752917  0.124383  0.064178  0.190739  0.031510  0.566884   \n",
      "729  0.255833  0.483333  0.350754  0.065451  0.123653  0.089734  0.233611   \n",
      "730  0.215833  0.577500  0.154846  0.046584  0.124644  0.033421  0.333506   \n",
      "\n",
      "        x1 x2      x2^2      x0^3    ...     x0^2 x2^2   x0 x1^3  x0 x1^2 x2  \\\n",
      "0    0.129293  0.025743  0.040767    ...      0.003049  0.180096    0.035858   \n",
      "1    0.173005  0.061772  0.048021    ...      0.008161  0.122594    0.043772   \n",
      "2    0.108579  0.061657  0.007572    ...      0.002377  0.016418    0.009323   \n",
      "3    0.094644  0.025695  0.008000    ...      0.001028  0.041167    0.011176   \n",
      "4    0.081667  0.034932  0.011690    ...      0.001799  0.018935    0.008099   \n",
      "5    0.046418  0.008022  0.008533    ...      0.000335  0.028446    0.004916   \n",
      "6    0.084143  0.028468  0.007590    ...      0.001099  0.024374    0.008246   \n",
      "7    0.142962  0.071184  0.004492    ...      0.001938  0.025385    0.012640   \n",
      "8    0.157147  0.131008  0.002647    ...      0.002507  0.011321    0.009438   \n",
      "9    0.107819  0.049848  0.003432    ...      0.001134  0.016987    0.007854   \n",
      "10   0.083827  0.014916  0.004835    ...      0.000426  0.054674    0.009729   \n",
      "11   0.182638  0.092798  0.005153    ...      0.002769  0.037224    0.018914   \n",
      "12   0.141596  0.090601  0.004492    ...      0.002467  0.017176    0.010990   \n",
      "13   0.068061  0.016014  0.004163    ...      0.000414  0.025027    0.005889   \n",
      "14   0.078784  0.024952  0.012704    ...      0.001359  0.028948    0.009168   \n",
      "15   0.091154  0.035507  0.012433    ...      0.001906  0.026226    0.010216   \n",
      "16   0.104284  0.037643  0.005436    ...      0.001164  0.027305    0.009856   \n",
      "17   0.126471  0.021543  0.010171    ...      0.001011  0.138615    0.023612   \n",
      "18   0.154517  0.043396  0.024942    ...      0.003705  0.119233    0.033486   \n",
      "19   0.105462  0.038378  0.017916    ...      0.002628  0.040823    0.014856   \n",
      "20   0.161461  0.124780  0.005592    ...      0.003931  0.016951    0.013100   \n",
      "21   0.068788  0.029574  0.000207    ...      0.000103  0.003784    0.001627   \n",
      "22   0.107646  0.060812  0.000899    ...      0.000567  0.008029    0.004536   \n",
      "23   0.077857  0.025068  0.000924    ...      0.000238  0.011580    0.003729   \n",
      "24   0.080079  0.016847  0.011161    ...      0.000841  0.052481    0.011041   \n",
      "25   0.253446  0.086348  0.010289    ...      0.004085  0.139552    0.047545   \n",
      "26   0.078263  0.012959  0.007415    ...      0.000493  0.063365    0.010492   \n",
      "27   0.097782  0.015203  0.008425    ...      0.000629  0.101486    0.015779   \n",
      "28   0.094740  0.021131  0.007590    ...      0.000816  0.054404    0.012134   \n",
      "29   0.053428  0.005473  0.010151    ...      0.000257  0.081551    0.008354   \n",
      "..        ...       ...       ...    ...           ...       ...         ...   \n",
      "701  0.102405  0.015470  0.041963    ...      0.001868  0.193946    0.029299   \n",
      "702  0.063488  0.006843  0.092652    ...      0.001401  0.204576    0.022049   \n",
      "703  0.127767  0.030321  0.107737    ...      0.006865  0.187974    0.044609   \n",
      "704  0.157150  0.104990  0.084219    ...      0.020172  0.050007    0.033409   \n",
      "705  0.088906  0.030539  0.016744    ...      0.001999  0.033688    0.011572   \n",
      "706  0.099800  0.017056  0.033025    ...      0.001756  0.143167    0.024468   \n",
      "707  0.092382  0.010278  0.055597    ...      0.001497  0.288800    0.032130   \n",
      "708  0.143033  0.024956  0.056697    ...      0.003683  0.285145    0.049751   \n",
      "709  0.176035  0.036217  0.082787    ...      0.006879  0.344941    0.070968   \n",
      "710  0.176636  0.087638  0.044112    ...      0.010941  0.075055    0.037239   \n",
      "711  0.087714  0.026548  0.026331    ...      0.002350  0.046413    0.014048   \n",
      "712  0.084598  0.030321  0.025890    ...      0.002654  0.033924    0.012159   \n",
      "713  0.084369  0.017221  0.022346    ...      0.001366  0.074852    0.015278   \n",
      "714  0.069172  0.011310  0.034065    ...      0.001189  0.089196    0.014584   \n",
      "715  0.084497  0.010149  0.047635    ...      0.001334  0.213897    0.025691   \n",
      "716  0.089128  0.009655  0.060853    ...      0.001494  0.293563    0.031800   \n",
      "717  0.147510  0.049020  0.069342    ...      0.008274  0.121500    0.040376   \n",
      "718  0.115134  0.033890  0.036760    ...      0.003747  0.081339    0.023942   \n",
      "719  0.088474  0.017546  0.035937    ...      0.001911  0.098329    0.019501   \n",
      "720  0.208407  0.140163  0.034859    ...      0.014957  0.056350    0.037898   \n",
      "721  0.179741  0.165931  0.018786    ...      0.011726  0.022838    0.021083   \n",
      "722  0.068593  0.017711  0.014857    ...      0.001070  0.033660    0.008691   \n",
      "723  0.061113  0.005965  0.012375    ...      0.000319  0.114608    0.011186   \n",
      "724  0.123977  0.028468  0.024719    ...      0.002416  0.115564    0.026537   \n",
      "725  0.260623  0.100201  0.014408    ...      0.005933  0.135809    0.052214   \n",
      "726  0.228608  0.122593  0.016419    ...      0.007920  0.070745    0.037937   \n",
      "727  0.091728  0.024171  0.016258    ...      0.001551  0.052029    0.013710   \n",
      "728  0.093650  0.015471  0.016258    ...      0.000993  0.108127    0.017863   \n",
      "729  0.169531  0.123028  0.016744    ...      0.008052  0.028887    0.020963   \n",
      "730  0.089424  0.023977  0.010054    ...      0.001117  0.041569    0.011146   \n",
      "\n",
      "     x0 x1 x2^2   x0 x2^3      x1^4   x1^3 x2  x1^2 x2^2   x1 x2^3      x2^4  \n",
      "0      0.007140  0.001422  0.421677  0.083958   0.016717  0.003328  0.000663  \n",
      "1      0.015629  0.005580  0.234776  0.083827   0.029931  0.010687  0.003816  \n",
      "2      0.005294  0.003006  0.036560  0.020761   0.011789  0.006695  0.003802  \n",
      "3      0.003034  0.000824  0.121531  0.032994   0.008958  0.002432  0.000660  \n",
      "4      0.003464  0.001482  0.036455  0.015593   0.006670  0.002853  0.001220  \n",
      "5      0.000850  0.000147  0.072143  0.012468   0.002155  0.000372  0.000064  \n",
      "6      0.002790  0.000944  0.061851  0.020926   0.007080  0.002395  0.000810  \n",
      "7      0.006294  0.003134  0.082436  0.041047   0.020438  0.010177  0.005067  \n",
      "8      0.007868  0.006560  0.035533  0.029622   0.024695  0.020587  0.017163  \n",
      "9      0.003631  0.001679  0.054386  0.025144   0.011625  0.005375  0.002485  \n",
      "10     0.001731  0.000308  0.221931  0.039491   0.007027  0.001250  0.000222  \n",
      "11     0.009610  0.004883  0.129207  0.065650   0.033356  0.016948  0.008611  \n",
      "12     0.007032  0.004500  0.048970  0.031334   0.020049  0.012829  0.008209  \n",
      "13     0.001386  0.000326  0.083669  0.019687   0.004632  0.001090  0.000256  \n",
      "14     0.002904  0.000920  0.061877  0.019598   0.006207  0.001966  0.000623  \n",
      "15     0.003979  0.001550  0.054763  0.021331   0.008309  0.003237  0.001261  \n",
      "16     0.003558  0.001284  0.083467  0.030128   0.010875  0.003926  0.001417  \n",
      "17     0.004022  0.000685  0.551262  0.093901   0.015995  0.002725  0.000464  \n",
      "18     0.009405  0.002641  0.302694  0.085012   0.023875  0.006705  0.001883  \n",
      "19     0.005406  0.001967  0.083985  0.030563   0.011122  0.004047  0.001473  \n",
      "20     0.010124  0.007824  0.043650  0.033733   0.026070  0.020147  0.015570  \n",
      "21     0.000699  0.000301  0.025600  0.011006   0.004732  0.002034  0.000875  \n",
      "22     0.002562  0.001447  0.036310  0.020512   0.011588  0.006546  0.003698  \n",
      "23     0.001201  0.000387  0.058471  0.018826   0.006062  0.001952  0.000628  \n",
      "24     0.002323  0.000489  0.144884  0.030481   0.006413  0.001349  0.000284  \n",
      "25     0.016198  0.005519  0.553397  0.188540   0.064235  0.021884  0.007456  \n",
      "26     0.001737  0.000288  0.223404  0.036991   0.006125  0.001014  0.000168  \n",
      "27     0.002453  0.000381  0.395537  0.061497   0.009561  0.001487  0.000231  \n",
      "28     0.002706  0.000604  0.180424  0.040242   0.008976  0.002002  0.000447  \n",
      "29     0.000856  0.000088  0.271999  0.027865   0.002855  0.000292  0.000030  \n",
      "..          ...       ...       ...       ...        ...       ...       ...  \n",
      "701    0.004426  0.000669  0.459518  0.069418   0.010487  0.001584  0.000239  \n",
      "702    0.002376  0.000256  0.346987  0.037398   0.004031  0.000434  0.000047  \n",
      "703    0.010586  0.002512  0.289863  0.068788   0.016324  0.003874  0.000919  \n",
      "704    0.022320  0.014912  0.055331  0.036966   0.024696  0.016499  0.011023  \n",
      "705    0.003975  0.001365  0.066991  0.023011   0.007904  0.002715  0.000933  \n",
      "706    0.004182  0.000715  0.340999  0.058278   0.009960  0.001702  0.000291  \n",
      "707    0.003575  0.000398  0.689525  0.076712   0.008534  0.000949  0.000106  \n",
      "708    0.008681  0.001515  0.672039  0.117256   0.020459  0.003570  0.000623  \n",
      "709    0.014601  0.003004  0.732094  0.150620   0.030988  0.006375  0.001312  \n",
      "710    0.018476  0.009167  0.126744  0.062884   0.031200  0.015480  0.007680  \n",
      "711    0.004252  0.001287  0.083985  0.025420   0.007694  0.002329  0.000705  \n",
      "712    0.004358  0.001562  0.055712  0.019968   0.007157  0.002565  0.000919  \n",
      "713    0.003119  0.000637  0.170852  0.034873   0.007118  0.001453  0.000297  \n",
      "714    0.002385  0.000390  0.178965  0.029263   0.004785  0.000782  0.000128  \n",
      "715    0.003086  0.000371  0.494914  0.059444   0.007140  0.000858  0.000103  \n",
      "716    0.003445  0.000373  0.676999  0.073335   0.007944  0.000861  0.000093  \n",
      "717    0.013418  0.004459  0.197037  0.065478   0.021759  0.007231  0.002403  \n",
      "718    0.007047  0.002074  0.152996  0.045034   0.013256  0.003902  0.001149  \n",
      "719    0.003867  0.000767  0.199017  0.039470   0.007828  0.001552  0.000308  \n",
      "720    0.025488  0.017142  0.096024  0.064581   0.043433  0.029211  0.019646  \n",
      "721    0.019463  0.017968  0.037909  0.034996   0.032307  0.029825  0.027533  \n",
      "722    0.002244  0.000579  0.070572  0.018222   0.004705  0.001215  0.000314  \n",
      "723    0.001092  0.000107  0.392079  0.038266   0.003735  0.000365  0.000036  \n",
      "724    0.006094  0.001399  0.291499  0.066936   0.015370  0.003529  0.000810  \n",
      "725    0.020075  0.007718  0.459518  0.176670   0.067924  0.026115  0.010040  \n",
      "726    0.020344  0.010910  0.181732  0.097456   0.052262  0.028026  0.015029  \n",
      "727    0.003613  0.000952  0.121174  0.031930   0.008414  0.002217  0.000584  \n",
      "728    0.002951  0.000488  0.321357  0.053089   0.008770  0.001449  0.000239  \n",
      "729    0.015213  0.011040  0.054574  0.039604   0.028741  0.020857  0.015136  \n",
      "730    0.002989  0.000801  0.111226  0.029823   0.007997  0.002144  0.000575  \n",
      "\n",
      "[731 rows x 34 columns]\n"
     ]
    }
   ],
   "source": [
    "#对数值型变量进行处理\n",
    "#对数据进行归一化处理\n",
    "########################\n",
    "from sklearn.preprocessing import PolynomialFeatures #用多项式做数值型数据处理\n",
    "numerical_features = [\"temp\",\"hum\",\"windspeed\"]\n",
    "poly = PolynomialFeatures(degree=4, include_bias=False, interaction_only=False)\n",
    "X_ploly = poly.fit_transform(data[numerical_features])\n",
    "X_ploly_df = pd.DataFrame(X_ploly, columns=poly.get_feature_names())\n",
    "print X_ploly_df\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train（训练）:(365, 51)\n"
     ]
    }
   ],
   "source": [
    "#将前边的特征值和4种数值值进行拼接生成一个新的data结果集\n",
    "\n",
    "x_train = pd.concat([x_train_cat,X_ploly_df,data['holiday'],data['workingday']],axis=1,ignore_index=False)\n",
    "df = pd.DataFrame(x_train)\n",
    "df.to_csv(\"C:\\Users\\ya\\w1yj8\\meng2.csv\")\n",
    "final_train = pd.concat([data['instant'],x_train,data['yr'],data['cnt']],axis=1,ignore_index=False)\n",
    "\n",
    "df = pd.DataFrame(final_train)\n",
    "df.to_csv(dpath+\"final.csv\",index=False)\n",
    "final_train.head()\n",
    "\n",
    "#加载生成的特征csv\n",
    "\n",
    "tz_data = pd.read_csv(dpath+\"final.csv\")\n",
    "\n",
    "\n",
    "\n",
    "train=tz_data[tz_data.yr==0] #训练数据\n",
    "\n",
    "train = train.drop(columns = ['instant','yr'])\n",
    "print \"train（训练）:\"+str(train.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test（测试）:(366, 51)\n",
      "     season_1  season_2  season_3  season_4  weathersit_1  weathersit_2  \\\n",
      "365         1         0         0         0             1             0   \n",
      "366         1         0         0         0             1             0   \n",
      "367         1         0         0         0             1             0   \n",
      "368         1         0         0         0             0             1   \n",
      "369         1         0         0         0             1             0   \n",
      "\n",
      "     weathersit_3  weekday_0  weekday_1  weekday_2  ...   x0 x1 x2^2  \\\n",
      "365             0          1          0          0  ...     0.009462   \n",
      "366             0          0          1          0  ...     0.011315   \n",
      "367             0          0          0          1  ...     0.008850   \n",
      "368             0          0          0          0  ...     0.001520   \n",
      "369             0          0          0          0  ...     0.002354   \n",
      "\n",
      "      x0 x2^3      x1^4   x1^3 x2  x1^2 x2^2   x1 x2^3      x2^4  holiday  \\\n",
      "365  0.002626  0.229974  0.063817   0.017709  0.004914  0.001364        0   \n",
      "366  0.009782  0.021139  0.018276   0.015801  0.013661  0.011811        1   \n",
      "367  0.007334  0.037909  0.031416   0.026035  0.021575  0.017880        0   \n",
      "368  0.000677  0.029542  0.013161   0.005863  0.002612  0.001164        0   \n",
      "369  0.000584  0.075488  0.018720   0.004642  0.001151  0.000285        0   \n",
      "\n",
      "     workingday   cnt  \n",
      "365           0  2294  \n",
      "366           0  1951  \n",
      "367           1  2236  \n",
      "368           1  2368  \n",
      "369           1  3272  \n",
      "\n",
      "[5 rows x 51 columns]\n"
     ]
    }
   ],
   "source": [
    "#取2012年的数据作为测试数据\n",
    "test=tz_data[tz_data.yr==1] #测试数据\n",
    "#取testID备份留作后用\n",
    "testID=test['instant']\n",
    "testCNT=test['cnt']\n",
    "\n",
    "test = test.drop(columns = ['instant','yr'])\n",
    "print \"test（测试）:\"+str(test.shape)\n",
    "print test.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(365, 50)\n",
      "(366, 50)\n"
     ]
    }
   ],
   "source": [
    "#准备训练数据\n",
    "#训练数据\n",
    "y_train = train['cnt']\n",
    "X_train = train\n",
    "X_train = X_train.drop(columns=['cnt'])\n",
    "#测试数据\n",
    "y_test_real = test['cnt']\n",
    "y_test = test['cnt']\n",
    "X_test = test\n",
    "X_test = X_test.drop(columns = ['cnt'])\n",
    "\n",
    "print X_train.shape\n",
    "print X_test.shape\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train_mean_y =  3405.76164384\n",
      "train_std_y =  1378.75366583\n",
      "0   -1.755761\n",
      "1   -1.889215\n",
      "2   -1.491754\n",
      "3   -1.337267\n",
      "4   -1.309706\n",
      "Name: cnt, dtype: float64\n",
      "365   -0.806353\n",
      "366   -1.055128\n",
      "367   -0.848420\n",
      "368   -0.752681\n",
      "369   -0.097016\n",
      "Name: cnt, dtype: float64\n",
      "标准化后的均值为 1.59141755106\n"
     ]
    }
   ],
   "source": [
    "#数据标准化\n",
    "\n",
    "from sklearn import preprocessing\n",
    "X_train = preprocessing.scale(X_train)\n",
    "X_test = preprocessing.scale(X_test)\n",
    "\n",
    "mean_y = y_train.mean()#训练数据的均值\n",
    "print \"train_mean_y = \" ,mean_y\n",
    "std_y = y_train.std()#训练数据的标准差\n",
    "print \"train_std_y = \",std_y\n",
    "\n",
    "\n",
    "y_train = (y_train-mean_y) /std_y #训练数据标准化后的y\n",
    "y_test = (y_test - mean_y ) /std_y#测试数据标准化后的y\n",
    "\n",
    "print y_train.head()\n",
    "print y_test.head()\n",
    "\n",
    "mean_test_y = y_test.mean()\n",
    "mean_diff = mean_test_y\n",
    "print \"标准化后的均值为\",mean_diff"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最佳的alpha =  0.5529999999754054\n"
     ]
    }
   ],
   "source": [
    "#岭回归模型训练\n",
    "from sklearn.linear_model import  RidgeCV #岭回归\n",
    "from sklearn.metrics import r2_score  #评价回归预测模型的性能\n",
    "\n",
    "# = alphas=[0.01,0.1,1,10,100,1000]  #最佳的alpha =  1.0\n",
    "#alphas = np.arange(0.09,0.15,0.01)  #最佳的alpha =  0.13999999999999996\n",
    "\n",
    "alphas = np.arange(-10.0,10.0,0.0001)  #最佳的alpha = 0.14\n",
    "\n",
    "\n",
    "ridge = RidgeCV(alphas = alphas,store_cv_values = True)\n",
    "\n",
    "#训练模型\n",
    "ridge.fit(X_train,y_train)\n",
    "\n",
    "alpha = ridge.alpha_\n",
    "print \"最佳的alpha = \",alpha"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cv of rmse 0.3908342071971943\n"
     ]
    }
   ],
   "source": [
    "#交叉验证得到的测试误差\n",
    "mse_cv = np.mean(ridge.cv_values_,axis=0)\n",
    "rmse = np.sqrt(mse_cv)\n",
    "print \"cv of rmse\",min(rmse)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集rmse 0.3434856133268883\n"
     ]
    }
   ],
   "source": [
    "# 训练误差\n",
    "from sklearn.metrics import mean_squared_error\n",
    "y_train_pred = ridge.predict(X_train)\n",
    "rmse_train = np.sqrt(mean_squared_error(y_train,y_train_pred))\n",
    "print \"训练集rmse\",rmse_train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试集rmse 0.5897366629801829\n"
     ]
    }
   ],
   "source": [
    "y_test_pred = ridge.predict(X_test)\n",
    "y_test_pred = y_test_pred + mean_diff\n",
    "rmse_test = np.sqrt(mean_squared_error(y_test,y_test_pred))\n",
    "print \"测试集rmse\",rmse_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "score of r2 train is  0.881693506056785\n",
      "score of r2 test is  0.7927863184832425\n"
     ]
    }
   ],
   "source": [
    "r2_score_train = r2_score(y_train,y_train_pred)\n",
    "r2_score_test = r2_score(y_test,y_test_pred)\n",
    "\n",
    "print \"score of r2 train is \",r2_score_train\n",
    "print \"score of r2 test is \", r2_score_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(10,5))\n",
    "mse_mean = np.mean(ridge.cv_values_,axis=0)\n",
    "plt.plot(alphas,mse_mean.reshape(len(alphas),1))\n",
    "plt.xlabel(\"alphas\")\n",
    "plt.ylabel(\"mse\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n",
      "D:\\Anaconda2\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最佳alpha_:  0.016592529909515638\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集rmse： 0.3955610092798882\n",
      "测试集rmse: 0.6573494111267396\n",
      "score of r2 train  0.8431016293878539\n",
      "score of r2 test  0.7425489145464718\n"
     ]
    }
   ],
   "source": [
    "#Lasso模型训练\n",
    "from sklearn.linear_model import LassoCV\n",
    "lasso = LassoCV()\n",
    "lasso.fit(X_train,y_train)\n",
    "\n",
    "\n",
    "alpha = lasso.alpha_\n",
    "print \"最佳alpha_: \",alpha\n",
    "mses = np.mean(lasso.mse_path_,axis=1)\n",
    "fig = plt.figure(figsize=(10,5))\n",
    "plt.plot(np.log10(lasso.alphas_),mses)\n",
    "plt.xlabel(\"log(alpha)\")\n",
    "plt.ylabel(\"mse\")\n",
    "plt.show()\n",
    "\n",
    "\n",
    "y_train_pred = lasso.predict(X_train)\n",
    "rmse_train = np.sqrt(mean_squared_error(y_train,y_train_pred))\n",
    "print \"训练集rmse：\",rmse_train\n",
    "\n",
    "y_test_pred = lasso.predict(X_test)+mean_diff\n",
    "rmse_test = np.sqrt(mean_squared_error(y_test,y_test_pred))\n",
    "print \"测试集rmse:\",rmse_test\n",
    "\n",
    "r2_score_train = r2_score(y_train,y_train_pred)\n",
    "r2_score_test = r2_score(y_test,y_test_pred)\n",
    "print \"score of r2 train \" ,r2_score_train\n",
    "print \"score of r2 test \" ,r2_score_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 366 entries, 365 to 730\n",
      "Data columns (total 3 columns):\n",
      "cnt        366 non-null int64\n",
      "instant    366 non-null int64\n",
      "pre_cnt    366 non-null float64\n",
      "dtypes: float64(1), int64(2)\n",
      "memory usage: 11.4 KB\n"
     ]
    }
   ],
   "source": [
    "#将生成的结果展示\n",
    "y_test_pred = lasso.predict(X_test)\n",
    "y_test_pred = y_test_pred+mean_diff#标准化的预测值\n",
    "\n",
    "y_test_pred = y_test_pred*std_y + mean_y\n",
    "\n",
    "fig = plt.figure()\n",
    "plt.plot(testID,y_test_pred,c=\"red\",label=\"pred\")\n",
    "plt.plot(testID,y_test_real,c=\"blue\",label=\"real value\")\n",
    "plt.xlabel(\"instant\")\n",
    "plt.ylabel(\"count\")\n",
    "plt.legend(loc=\"best\")\n",
    "plt.show()\n",
    "\n",
    "\n",
    "df=pd.DataFrame({\"instant\":testID,\"cnt\":y_test_real,'pre_cnt':y_test_pred})\n",
    "df.to_csv(dpath+'result.csv')\n",
    "df.info()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
